package xyz.yq56.easytool.utils.page;

import java.util.Collection;
import java.util.Collections;
import java.util.List;

import xyz.yq56.easytool.utils.nvll.NullUtil;

/**
 * @author yi qiang
 * @date 2021/9/24 1:04
 */
public class PageUtil {

    private PageUtil() {
    }

    /**
     * 获取起始位置
     *
     * @param pageId 页数
     * @param size   页面大小
     * @return 起始位置
     */
    public static int getStart(int pageId, int size) {
        return Math.max(pageId - 1, 0) * size;
    }

    /**
     * 获取总页数
     *
     * @param totalCount 总页数
     * @param pageSize   页面大小
     * @return 总页数
     */
    public static int getPageCount(int totalCount, int pageSize) {
        return (totalCount + pageSize - 1) / pageSize;
    }

    public static int getPageSizeFromOffset(int startIndex, int endIndex) {
        return endIndex - startIndex;
    }

    /**
     * 获取每页的数据
     *
     * @param list     原始list
     * @param page     页码
     * @param pageSize 页面大小
     * @param <T>      泛型
     * @return 每页的数据
     */
    public static <T> List<T> getPage(List<T> list, int page, int pageSize) {
        if (!NullUtil.isEmpty(list)) {
            int start = Math.max(0, page - 1) * pageSize;
            if (start >= list.size()) {
                return Collections.emptyList();
            } else {
                int end = Math.min(start + pageSize, list.size());
                return list.subList(start, end);
            }
        } else {
            return Collections.emptyList();
        }
    }

    /**
     * 获取总页数
     *
     * @param collection 集合
     * @param size       页面大小
     * @param <T>        泛型
     * @return 总页数
     */
    public static <T> int pageCount(Collection<T> collection, int size) {
        if (!NullUtil.isEmpty(collection) && size != 0) {
            return collection.size() / size + (collection.size() % size == 0 ? 0 : 1);
        }
        return 0;
    }

    public static <T> int totalItemCountForNextPage(Collection<T> items, int page, int pageSize) {
        return items.size() < pageSize ? getStart(page, pageSize) + items.size() : getStart(page + 1, pageSize) + 1;
    }

}
